package io.github.echarts.model.coordinate;

import io.github.echarts.model.geometry.Rectangle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 坐标系管理器
 * 负责集中管理所有坐标系的创建、存储和检索
 */
public class CoordinateSystemManager {
    
    /**
     * 坐标系工厂，负责创建各类坐标系
     */
    private final CoordinateSystemFactory factory;
    
    /**
     * 存储所有坐标系的映射表
     */
    private final Map<String, CoordinateSystem> coordinateSystems;
    
    /**
     * 主坐标系，默认使用的坐标系
     */
    private CoordinateSystem mainCoordinateSystem;
    
    /**
     * 坐标系类型计数器，用于生成有序的ID
     */
    private final Map<CoordinateSystemType, Integer> typeCounters;
    
    /**
     * 创建坐标系管理器
     */
    public CoordinateSystemManager() {
        this.factory = new CoordinateSystemFactory();
        this.coordinateSystems = new HashMap<>();
        this.typeCounters = new HashMap<>();
        
        // 初始化类型计数器
        for (CoordinateSystemType type : CoordinateSystemType.values()) {
            typeCounters.put(type, 0);
        }
    }
    
    /**
     * 生成规范化的坐标系ID
     * 
     * @param type 坐标系类型
     * @return 生成的唯一ID
     */
    public String generateCoordinateSystemId(CoordinateSystemType type) {
        // 获取当前类型的计数值
        Integer count = typeCounters.get(type);
        if (count == null) {
            count = 0;
        }
        
        // 增加计数并更新
        count++;
        typeCounters.put(type, count);
        
        // 返回格式化的ID: type_index
        return type.name().toLowerCase() + "_" + count;
    }
    
    /**
     * 创建坐标系并添加到管理器
     * 
     * @param type 坐标系类型
     * @param area 布局区域
     * @param config 配置对象
     * @return 创建的坐标系ID
     */
    public String createCoordinateSystem(CoordinateSystemType type, Rectangle area, Object config) {
        // 生成唯一ID
        String id = generateCoordinateSystemId(type);
        
        // 使用工厂创建坐标系
        CoordinateSystem system = factory.createCoordinateSystem(type, id, area, config);
        
        // 添加到管理器
        addCoordinateSystem(id, system);
        
        return id;
    }
    
    /**
     * 添加坐标系到管理器
     * 
     * @param id 坐标系ID
     * @param system 坐标系实例
     */
    public void addCoordinateSystem(String id, CoordinateSystem system) {
        coordinateSystems.put(id, system);
        
        // 如果没有主坐标系，将第一个添加的设为主坐标系
        if (mainCoordinateSystem == null) {
            mainCoordinateSystem = system;
        }
    }
    
    /**
     * 获取主坐标系
     * 
     * @return 主坐标系
     */
    public CoordinateSystem getMainCoordinateSystem() {
        return mainCoordinateSystem;
    }
    
    /**
     * 设置主坐标系
     * 
     * @param system 要设为主坐标系的坐标系
     */
    public void setMainCoordinateSystem(CoordinateSystem system) {
        this.mainCoordinateSystem = system;
    }
    
    /**
     * 根据ID获取坐标系
     * 
     * @param id 坐标系ID
     * @return 对应的坐标系，如果不存在则返回主坐标系
     */
    public CoordinateSystem getCoordinateSystem(String id) {
        if (id == null || !coordinateSystems.containsKey(id)) {
            return getMainCoordinateSystem();
        }
        return coordinateSystems.get(id);
    }
    
    /**
     * 获取所有坐标系列表
     * 
     * @return 所有坐标系列表
     */
    public List<CoordinateSystem> getAllCoordinateSystems() {
        return new ArrayList<>(coordinateSystems.values());
    }
    
    /**
     * 获取特定类型的所有坐标系
     * 
     * @param type 坐标系类型
     * @return 指定类型的坐标系列表
     */
    public List<CoordinateSystem> getCoordinateSystemsByType(CoordinateSystemType type) {
        List<CoordinateSystem> result = new ArrayList<>();
        for (CoordinateSystem system : coordinateSystems.values()) {
            if (system.getType() == type) {
                result.add(system);
            }
        }
        return result;
    }
    
    /**
     * 确保默认坐标系存在
     * 
     * @param defaultArea 默认区域
     * @return 默认坐标系的ID
     */
    public String ensureDefaultCoordinateSystem(Rectangle defaultArea) {
        // 如果已有主坐标系，直接返回其ID
        if (mainCoordinateSystem != null) {
            return mainCoordinateSystem.getId();
        }
        
        // 否则创建默认的笛卡尔坐标系
        return createCoordinateSystem(CoordinateSystemType.CARTESIAN, defaultArea, null);
    }
    
    /**
     * 清除所有坐标系
     */
    public void clear() {
        coordinateSystems.clear();
        mainCoordinateSystem = null;
        
        // 重置计数器
        for (CoordinateSystemType type : CoordinateSystemType.values()) {
            typeCounters.put(type, 0);
        }
    }
} 